問題の説明
JwtSecurityTokenHandler.CreateToken で署名するときに「無効なアルゴリズムが指定されました」 ("Invalid algorithm specified" when signing with JwtSecurityTokenHandler.CreateToken)
数年間、問題なく JWT トークンに署名しています。最近 Windows 10 にアップグレードしましたが、JWT トークンに署名しようとすると、「指定されたアルゴリズムが無効です」という CryptographicException が発生します。
このメソッドに X509Certificate2 を渡していますが、他に何もしていません。
System.IdentityModel.Tokens.JwtSecurityTokenHandler.CreateToken()
署名証明書は以前は SHA‑1 を使用して作成されていたので、SHA‑256 RSA を使用して新しい署名証明書を作成しましたが、それでも満足できませんでした.
いくつか読んだ「Microsoft Enhanced RSA and AES Cryptographic Provider」を有効にするか、少なくともそれを使用して署名証明書を作成する必要があることを示唆するSOの質問。多くの SO Qu がこの行を追加することを提案しましたが、まだ成功していません。
CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig‑more#rsa‑sha256");
また、このアルゴリズムがレジストリにあることも確認し、プロバイダー リストとプロバイダー タイプ リストで見つけました。残念ながら、Jwt 署名コードが System.Identity ライブラリ内にすべて隠されているため、どのアルゴリズムを使用するかを制御することはできません。前述の「強化された」ものではなく、「Microsoft Strong Cryptographic Provider」の RSA プロバイダーですが、MSDN のドキュメントからはほとんど同じように見えます。署名証明書を読み取ったり解釈したりするためのアルゴリズムではなく、実際のトークンに署名するために使用されるアルゴリズムを見つけますか?
JwtSecurityTokenHandler コードの限られた柔軟性で他にどのようなチェックを行うことができますか?<
リファレンスソリューション
方法 1:
I recently had to tackle the exact same issue.
TL;DR; You need to use "Microsoft Enhanced RSA and AES Cryptographic Provider", as opposed to what I suspect you are using which is "Microsoft Enhanced Cryptographic Provider v1.0".
You can find a full explanatory [ReadME][2], and source code at Karama.Jwt.Public. I happen to be using a different library for generating my JWT, namely JOSE, but I think that this is incidental.
Please let me know how you get on.
(by peter.swallow、Darren Schwarz)